Enunciado

Bienvenidos a la Actividad 1, donde pondremos en práctica todo lo aprendido durante el bloque 2. Esta actividad la realizaremos en clase, se terminará en casa (debería completarse en clase) y se entregará el día 8 de octubre.

¿En qué consiste?

Vamos a poner en práctica cuatro aspectos del procesamiento de imágenes:

La finalidad es sencilla. Se os dará una imagen, a color, que tiene varias tonalidades y que está pintada con círculos.

La actividad consiste en contar el número de círculos de la imagen. image.png

Evaluación

Se evaluará de la siguiente manera:

Formato de entrega

No se aceptará el formato .ipynb Habilitaré una actividad en Canvas para que podáis subir ambos archivos.

Inicialización

En primer lugar, cargamos todos los paquetes/frameworks que nos van a hacer falta. Se recomienda visitar la web: https://scikit-image.org/ para ver todas las funcionalidades que permite Scikit Image.

Cargar la imagen

Lo primero de todo, vamos a leer la imagen. Recuerda que hay que subir la imagen cada vez que inicies sesión en el notebook y que la ruta se mira haciendo botón derecho sobre el archivo.

Con lo cual, aquí vamos a hacer dos cosas:

Hacemos esto para luego posteriormente umbralizar la imagen en escala de grises.

Umbralizar la imagen con varios métodos

Vamos a probar ahora diferentes métodos para umbralizar la imagen. Se pide en esta actividad:

UMBRALIZACION GLOBAL

Esta función calcula el umbral óptimo para una imagen en escala de grises de modo que la varianza intraclase (varianza dentro de las dos clases, blanco y negro) sea mínima. Busca el umbral que maximiza la separación entre los objetos y el fondo en la imagen. Es útil cuando el contraste entre objetos y fondo es alto.

UMBRALIZACIÓN LOCAL

Esta función calcula umbrales locales para cada región de una imagen en función de un tamaño de bloque especificado. Es útil para imágenes con iluminación variable o no uniforme. Se puede ajustar el tamaño de la ventana para adaptarlo a las características locales de la imagen.

block_size determina el tamaño del bloque de vecindario para el cálculo del umbral local. He elegido 55.

UMBRALIZACIÓN NIBLACK

Se trata de un tipo de umbralización local, por lo que también utiliza una ventana, pero utiliza un método diferente que considera el promedio y la desviación estándar local para calcular el umbral.

Utilizo window_size, que representa el tamaño de la ventana de vecindario que se utilizará para calcular el umbral local. block_size se utiliza como el valor de window_size. La ventana de vecindario se desliza por toda la imagen y en cada posición se calcula un umbral local basado en los píxeles dentro de la ventana.

UMBRALIZACIÓN SAUVOLA

Esta función calcula umbrales locales utilizando un método basado en la media y la desviación estándar local, similar a threshold_niblack. Sin embargo, threshold_sauvola considera una ponderación adicional que tiene en cuenta las diferencias de contraste en regiones de diferentes tamaños.

Conclusión: Podemos ver que, de todas las umbralizaciones, obtenemos el mejor resultado de la umbralización local. Vemos como tiene una segmentación más precisa al ajustar el umbral en regiones específicas, como mantiene mejor los detalles y como separa los objetos conectados, a diferencia del resto.

¿Se obtiene el mismo resultado si se rota la imagen 180º?¿Por qué?

No, generalmente no se obtiene el mismo resultado si se umbraliza una imagen con umbral local antes y después de rotarla 180 grados. Esto se debe a que la rotación de la imagen cambia la distribución espacial de los píxeles y, por lo tanto, afecta a la umbralización local.

La umbralización local se basa en calcular umbrales adaptativos para regiones o ventanas pequeñas de la imagen. Estos umbrales dependen de la distribución de intensidades locales dentro de esas ventanas. Cuando rotas la imagen 180 grados, la relación espacial y las orientaciones de las características en la imagen cambian drásticamente. Como resultado, las regiones que se consideran como objetos y fondo pueden cambiar, y las características locales que se utilizan para calcular los umbrales también se alterarán.

Morfología Matemática

Como se puede apreciar en la imagen hay varios elementos imperfectos:

Mediante el uso de morfología matemática (concretamente los cuatro operadores visto en clase) y los posibles elementos estructurales existentes, se pide:

EROSIÓN

Inicialmente utilicé ambos elementos estructurales con un tamaño de 5 (disco de radio 5 y rectangulo 5x5). Sin embargo, como el tamaño del elemento estructural debe estar relacionado con el tamaño de los objetos que deseo analizar en la imagen, decidí reducir el tamaño a 1.

Si los objetos son pequeños, el elemento estructural debe ser pequeño, y si son grandes, el elemento debe ser más grande.

Como la imagen tiene círculos pequeños, la erosión con un elemento de disco parece ser más apropiada porque se adapta bien a la forma circular de los objetos y permite una reducción uniforme del tamaño mientras conserva la forma.

DILATACIÓN

No he obtenido el resultado deseado, por lo que voy a reducir las dimenciones de los elementos estructurales a 2.

En este caso, obtenemos mejores resultados utilizando el rectangulo como elemento estructural.

La dilatación con un elemento de rectángulo, en este caso, expande y modifica los objetos de acuerdo con la forma y el tamaño del rectángulo. Esto nos ayuda a mejorar la conectividad o el alargamiento de objetos en una dirección específica.

APERTURA

Reduzco de nuevo las dimensiones de los elementos estructurales

La apertura es una operación que consiste en aplicar primero una erosión a una imagen y luego una dilatación a la imagen erosionada. Esta operación se utiliza para eliminar pequeños objetos o detalles ruidosos en una imagen mientras se preservan los objetos más grandes y estructuras de interés.

En cuanto a la elección del elemento estructural para la apertura, me quedo con el tipo disco, ya que es capaz de preservar la forma circular de los círculos mientras elimina objetos o detalles más pequeños.

CLAUSURA

La clausura cierra pequeños huecos y une objetos en una imagen al aplicar primero una dilatación seguida de una erosión. El elemento estructural de rectángulo considero que ha sido más efectivo en la clausura porque se suele utilizar cuando se desean unir objetos en direcciones específicas y cerrar espacios alargados debido a su forma rectangular y capacidad para conservar la orientación.

CONCLUSIÓN: El mejor operador para mí es la APERTURA (erosión + dilatación). Es la mejor opción porque elimina el ruido y detalles no deseados mientras preserva la forma y el tamaño de los círculos en la imagen, mejorando la calidad y la claridad de los objetos.

IMAGEN COMPLEMENTARIA CON APERTURA (DISCO)

La imagen complementaria es una imagen en la que los valores de píxeles se invierten: los píxeles oscuros se vuelven claros y viceversa.

Contando círculos

Haciendo uso de las funcionalidades cargadas al principio, se pide hacer una función que:

Por último, ¿qué se podría hacer para asegurar que no se tienen en cuenta posibles errores en la umbralización como pequeños puntos o posible ruido que haya llegado hasta este punto?

He elegido la imagen imagen_apertura_disco para contar los círculos. Para ver la diferencia, también contaré los circulos de la imagen imagen_dilatada_rectangulo.

Vemos como se distinguen mas circulos en la imagen con apertura que en la de dilatación solo.

¿Qué se podría hacer para asegurar que no se tienen en cuenta posibles errores en la umbralización como pequeños puntos o posible ruido que haya llegado hasta este punto?

Filtrado de Área: se podría eliminar objetos en la imagen binaria que tienen un área por debajo de un umbral específico. Los objetos pequeños, como puntos o ruido, generalmente tienen áreas pequeñas.

Filtrado por Aspect Ratio: Si los círculos son los objetos de interés y se espera que tengan una forma circular, se podría calcular el aspect ratio (relación entre ancho y alto) de los objetos etiquetados y eliminar aquellos cuyo aspect ratio esté fuera de un rango específico. Esto ayudará a eliminar objetos alargados que no son círculos.

Filtrado Morfológico: Después de aplicar operaciones morfológicas, como la apertura o clausura, se podría aplicar una operación de eliminación de objetos pequeños utilizando una operación de eliminación de objetos conectados para eliminar regiones pequeñas que puedan representar errores.